{
  "nbformat_minor": 0,
  "nbformat": 4,
  "cells": [
    {
      "source": [
        "#### Copyright 2017 Google LLC."
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "JndnmDMp66FL"
      }
    },
    {
      "source": [
        "# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ],
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "hMqWDc_m6rUC",
        "colab": {
          "autoexec": {
            "wait_interval": 0,
            "startup": false
          }
        },
        "cellView": "both"
      },
      "outputs": [],
      "execution_count": 0
    },
    {
      "source": [
        " # Concepts de programmation de TensorFlow"
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "rFpcvnCJ4Xkf"
      }
    },
    {
      "source": [
        " **Objectifs de formation**\u00a0:\n",
        "  * D\u00e9couvrir les bases du mod\u00e8le de programmation TensorFlow, en particulier les concepts suivants\u00a0:\n",
        "    * Les Tensors\n",
        "    * Les op\u00e9rations\n",
        "    * Les graphes\n",
        "    * Les sessions\n",
        "  * D\u00e9velopper un programme TensorFlow simple permettant de cr\u00e9er un graphe par d\u00e9faut, ainsi qu'une session pour ex\u00e9cuter ce graphe"
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "9IkBOsrNzahz"
      }
    },
    {
      "source": [
        " **Remarque**\u00a0: Veuillez lire attentivement ce didacticiel. Le mod\u00e8le de programmation TensorFlow diff\u00e8re sans doute de ceux que vous avez pu rencontrer jusqu'\u00e0 maintenant. Il peut donc ne pas \u00eatre aussi intuitif que vous pouvez l'imaginer."
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "YMG9mHPdzahz"
      }
    },
    {
      "source": [
        " ## Pr\u00e9sentation des concepts\n\n",
        "Le terme TensorFlow est d\u00e9riv\u00e9 du mot **Tensors**, qui d\u00e9signe des tableaux de dimension arbitraire. TensorFlow permet d'utiliser des Tensors avec un nombre tr\u00e8s \u00e9lev\u00e9 de dimensions. Ceci \u00e9tant, vous utiliserez le plus souvent un ou plusieurs des Tensors de faible dimension ci-apr\u00e8s\u00a0:\n\n",
        "  * Un **scalaire** est un tableau \u00e0 z\u00e9ro\u00a0dimension (Tensor d'ordre\u00a00). Exemple\u00a0: `\\'Salut\\'` ou `5`.\n",
        "  * Un **vecteur** est un tableau \u00e0 une\u00a0dimension (Tensor d'ordre\u00a01). Exemple\u00a0: `[2, 3, 5, 7, 11]` ou `[5]`.\n",
        "  * Une **matrice** est un tableau \u00e0 deux\u00a0dimensions (Tensor d'ordre\u00a02). Exemple\u00a0: `[[3.1, 8.2, 5.9][4.3, -2.7, 6.5]]`.\n\n",
        "Vous pouvez cr\u00e9er, supprimer et manipuler les Tensors au moyen d'**op\u00e9rations**. Dans un programme TensorFlow standard, les lignes de code correspondent essentiellement \u00e0 des op\u00e9rations.\n\n",
        "Un **graphe** TensorFlow (aussi appel\u00e9 **graphe de calcul** ou **graphe de flux de donn\u00e9es**) d\u00e9signe la repr\u00e9sentation graphique d'une structure de donn\u00e9es. De nombreux programmes TensorFlow sont constitu\u00e9s d'un seul graphe, mais il est tout \u00e0 possible d'en cr\u00e9er plusieurs. Les n\u0153uds du graphe repr\u00e9sentent des op\u00e9rations, tandis que les ar\u00eates repr\u00e9sentent des Tensors. Les Tensors passent d'un n\u0153ud \u00e0 l'autre et subissent \u00e0 chaque fois une op\u00e9ration. Le Tensor de sortie d'une op\u00e9ration devient souvent le Tensor d'entr\u00e9e de l'op\u00e9ration suivante. TensorFlow repose sur un **mod\u00e8le d'ex\u00e9cution paresseux**\u00a0: les n\u0153uds ne sont calcul\u00e9s qu'en cas de n\u00e9cessit\u00e9, en fonction des besoins des n\u0153uds associ\u00e9s.\n\n",
        "Les Tensors sont enregistr\u00e9s dans le graphe en tant que **constantes** ou **variables**. Comme vous pouvez l'imaginer, les constantes correspondent aux Tensors de valeur fixe. Les variables, elles, d\u00e9signent les Tensors de valeur variable. Ce qui vous aura peut-\u00eatre \u00e9chapp\u00e9, en revanche, c'est que les constantes et les variables s'ajoutent aux autres op\u00e9rations du graphe. Ainsi, une constante est une op\u00e9ration renvoyant syst\u00e9matiquement la m\u00eame valeur de Tensor, et une variable une op\u00e9ration renvoyant le Tensor qui lui a \u00e9t\u00e9 affect\u00e9.\n\n",
        "Pour d\u00e9finir une constante, vous devez utiliser l'op\u00e9rateur `tf.constant` et transmettre sa valeur. Par exemple\u00a0:\n",
        "```\n",
        "  x = tf.constant([5.2])\n",
        "```\n\n",
        "De la m\u00eame fa\u00e7on, le code suivant permet de cr\u00e9er une variable\u00a0:\n",
        "```\n",
        "  y = tf.Variable([5])\n",
        "```\n\n",
        "Vous pouvez \u00e9galement cr\u00e9er la variable, puis lui affecter une valeur (une valeur par d\u00e9faut doit \u00eatre d\u00e9finie)\u00a0:\n",
        "```\n",
        "  y = tf.Variable([0])\n",
        "  y = y.assign([5])\n",
        "```\n\n",
        "Apr\u00e8s avoir d\u00e9fini plusieurs constantes ou variables, vous pouvez les combiner avec d'autres op\u00e9rations (par exemple, `tf.add`). Lors de son \u00e9valuation, `tf.add` appelle les op\u00e9rations `tf.constant` ou `tf.Variable` afin d'obtenir leur valeur, puis renvoie un nouveau Tensor correspondant \u00e0 la somme de ces valeurs.\n\n",
        "Les graphes doivent \u00eatre ex\u00e9cut\u00e9s dans une **session** TensorFlow, qui maintient leur \u00e9tat\u00a0:\n",
        "```\n",
        "with tf.Session() as sess:\n",
        "  initialization = tf.global_variables_initializer()\n",
        "  print(y.eval())\n",
        "```\n\n",
        "Les op\u00e9rations `tf.Variable` doivent \u00eatre initialis\u00e9es explicitement en appelant `tf.global_variables_initializer` au d\u00e9but de la session, comme illustr\u00e9 ci-dessus.\n\n",
        "**Remarque**\u00a0: Les graphes d'une session peuvent \u00eatre ex\u00e9cut\u00e9s sur plusieurs machines (\u00e0 condition d'ex\u00e9cuter le programme sur un framework de calcul distribu\u00e9). Pour en savoir plus, consultez la page [Distributed TensorFlow (Programme TensorFlow distribu\u00e9)](https://www.tensorflow.org/deploy/distributed).\n",
        "### R\u00e9sum\u00e9\n\n",
        "Le processus de programmation TensorFlow se divise en deux\u00a0grandes \u00e9tapes\u00a0:\n",
        "1. Assemblage des constantes, variables et op\u00e9rations sur un graphe\n",
        "2. \u00c9valuation de ces constantes, variables et op\u00e9rations au sein d'une session\n",
        ""
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "NzKsjX-ufyVY"
      }
    },
    {
      "source": [
        " ## Cr\u00e9er un programme TensorFlow simple\n",
        "\n",
        "Voyons comment coder un programme TensorFlow simple afin d'ajouter deux\u00a0constantes. "
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "VL0yWNNdgBpG"
      }
    },
    {
      "source": [
        " ### D\u00e9finir des d\u00e9clarations `import`\n",
        "\n",
        "Comme pour la quasi-totalit\u00e9 des programmes Python, la premi\u00e8re \u00e9tape consiste \u00e0 d\u00e9finir des d\u00e9clarations `import`.\n",
        "\u00c9videmment, ces d\u00e9clarations varient en fonction des fonctions auquel le programme TensorFlow doit acc\u00e9der. Tout programme TensorFlow doit au moins contenir la d\u00e9claration `import tensorflow`\u00a0:"
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "mN4R0gmMzah3"
      }
    },
    {
      "source": [
        "import tensorflow as tf"
      ],
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "SDbi6heigEGA",
        "colab": {
          "autoexec": {
            "wait_interval": 0,
            "startup": false
          }
        }
      },
      "outputs": [],
      "execution_count": 0
    },
    {
      "source": [
        " **N'oubliez pas d'ex\u00e9cuter le bloc de code qui pr\u00e9c\u00e8de (les d\u00e9clarations `import`).**\n",
        "\n",
        "Autres d\u00e9clarations `import` courantes\u00a0:\n",
        "\n",
        "```\n",
        "import matplotlib.pyplot as plt # Visualisation d'un ensemble de donn\u00e9es.\n",
        "import numpy as np              # Biblioth\u00e8que num\u00e9rique Python de niveau inf\u00e9rieur.\n",
        "import pandas as pd             # Biblioth\u00e8que num\u00e9rique Python de niveau sup\u00e9rieur.\n",
        "```"
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "6RRT4YIA4fQd"
      }
    },
    {
      "source": [
        " Le mod\u00e8le TensorFlow propose un **graphe par d\u00e9faut**. Nous vous recommandons cependant de cr\u00e9er votre propre `graphe` pour faciliter le suivi de son \u00e9tat (vous pouvez utiliser un `graphe` diff\u00e9rent par cellule, par exemple)."
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "1aNpvufRgbTD"
      }
    },
    {
      "source": [
        "from __future__ import print_function\n\n",
        "import tensorflow as tf\n",
        "\n",
        "# Create a graph.\n",
        "g = tf.Graph()\n",
        "\n",
        "# Establish the graph as the \"default\" graph.\n",
        "with g.as_default():\n",
        "  # Assemble a graph consisting of the following three operations:\n",
        "  #   * Two tf.constant operations to create the operands.\n",
        "  #   * One tf.add operation to add the two operands.\n",
        "  x = tf.constant(8, name=\"x_const\")\n",
        "  y = tf.constant(5, name=\"y_const\")\n",
        "  sum = tf.add(x, y, name=\"x_y_sum\")\n",
        "\n",
        "\n",
        "  # Now create a session.\n",
        "  # The session will run the default graph.\n",
        "  with tf.Session() as sess:\n",
        "    print(sum.eval())"
      ],
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "Md8ze8e9geMi",
        "colab": {
          "autoexec": {
            "wait_interval": 0,
            "startup": false
          }
        }
      },
      "outputs": [],
      "execution_count": 0
    },
    {
      "source": [
        " ## Exercice\u00a0: Ajouter une troisi\u00e8me op\u00e9rande\n",
        "\n",
        "Modifiez le code ci-dessus pour ajouter trois\u00a0entiers, au lieu de deux\u00a0:\n",
        "\n",
        "  1. D\u00e9finissez un troisi\u00e8me entier scalaire de type constante (`z`), auquel vous affectez la valeur `4`.\n",
        "  2. Ajoutez `z` \u00e0 l'op\u00e9ration `sum` pour r\u00e9aliser une nouvelle addition.\n",
        "  \n",
        "  **Astuce**\u00a0: Pour en savoir plus sur la signature de la fonction, consultez la documentation de l'API relative \u00e0 [tf.add()](https://www.tensorflow.org/api_docs/python/tf/add).\n",
        "  \n",
        "  3. Ex\u00e9cutez de nouveau le bloc de code modifi\u00e9. Obtenez-vous le bon total\u00a0?"
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "7mSz5GVqggZy"
      }
    },
    {
      "source": [
        " ### Solution\n",
        "\n",
        "Cliquez ci-dessous pour afficher la solution."
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "Zep4W80H9awM"
      }
    },
    {
      "source": [
        "# Create a graph.\n",
        "g = tf.Graph()\n",
        "\n",
        "# Establish our graph as the \"default\" graph.\n",
        "with g.as_default():\n",
        "  # Assemble a graph consisting of three operations. \n",
        "  # (Creating a tensor is an operation.)\n",
        "  x = tf.constant(8, name=\"x_const\")\n",
        "  y = tf.constant(5, name=\"y_const\")\n",
        "  sum = tf.add(x, y, name=\"x_y_sum\")\n",
        "  \n",
        "  # Task 1: Define a third scalar integer constant z.\n",
        "  z = tf.constant(4, name=\"z_const\")\n",
        "  # Task 2: Add z to `sum` to yield a new sum.\n",
        "  new_sum = tf.add(sum, z, name=\"x_y_z_sum\")\n",
        "\n",
        "  # Now create a session.\n",
        "  # The session will run the default graph.\n",
        "  with tf.Session() as sess:\n",
        "    # Task 3: Ensure the program yields the correct grand total.\n",
        "    print(new_sum.eval())"
      ],
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "4OTZPqhS9kzu",
        "colab": {
          "autoexec": {
            "wait_interval": 0,
            "startup": false
          }
        }
      },
      "outputs": [],
      "execution_count": 0
    },
    {
      "source": [
        " ## En savoir plus\n",
        "\n",
        "Pour en apprendre davantage sur les graphes TensorFlow standards, reportez-vous au didacticiel suivant\u00a0:\n",
        "\n",
        "  * [Ensemble de Mandelbrot](https://www.tensorflow.org/tutorials/non-ml/mandelbrot)"
      ],
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "BrlnLTesgywL"
      }
    }
  ],
  "metadata": {
    "colab": {
      "default_view": {},
      "version": "0.3.2",
      "collapsed_sections": [
        "JndnmDMp66FL",
        "Zep4W80H9awM"
      ],
      "name": "tensorflow_programming_concepts.ipynb",
      "views": {}
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  }
}
